home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / dskut / 2m21src.zip / 2MFBOOT.ASM < prev    next >
Assembly Source File  |  1994-05-31  |  64KB  |  1,492 lines

  1.  
  2. ;┌───────────────────────────────────────────────────────────────────┐
  3. ;│                                                                   │
  4. ;│             █████ █   █ █▀▀▀▀ █▀▀▄  ▄▀▀▀▄ ▄▀▀▀▄ ▀▀█▀▀             │
  5. ;│                 █ ██ ██ █     █   █ █   █ █   █   █               │
  6. ;│             █████ █ █ █ █▀▀   █▀▀█  █   █ █   █   █               │
  7. ;│             █     █   █ █     █   █ █   █ █   █   █               │
  8. ;│             █████ █   █ █     █▄▄▀  ▀▄▄▄▀ ▀▄▄▄▀   █               │
  9. ;│                                                                   │
  10. ;│    2MFBOOT 2.1  -  (C) Mayo 1994  Ciriaco García de Celis.        │
  11. ;│                                                                   │
  12. ;│            CODIGO 2M PARA ARRANQUE FRIO DESDE DISQUETE.           │
  13. ;│                                                                   │
  14. ;│  Proceso:                                                         │
  15. ;│                                                                   │
  16. ;│    TASM    2MFBOOT /m5                                            │
  17. ;│    TLINK   2MFBOOT                                                │
  18. ;│    EXE2BIN 2MFBOOT.EXE 2MFBOOT.BIN                                │
  19. ;│                                                                   │
  20. ;│    El fichero .BIN hay que convertirlo a .DB con 2MFBMAKE.BAS     │
  21. ;│    Es necesario que este fichero ocupe exactamente 2560 bytes     │
  22. ;│                                                                   │
  23. ;└───────────────────────────────────────────────────────────────────┘
  24.  
  25.                .286                    ; versión para AT o superior
  26.  
  27. ; ------------ Macros de propósito general.
  28.  
  29. XPUSH          MACRO regmem            ; apilar lista de registros
  30.                  IRP rm, <regmem>
  31.                    PUSH rm
  32.                  ENDM
  33.                ENDM
  34.  
  35. XPOP           MACRO regmem            ; desapilar lista de registros
  36.                  IRP rm, <regmem>
  37.                    POP rm
  38.                  ENDM
  39.                ENDM
  40.  
  41. DELAY          MACRO                   ; estados de espera
  42.                  JMP SHORT $+2         ; para AT obsoleto
  43.                  JMP SHORT $+2
  44.                ENDM
  45.  
  46. PMICRO         MACRO
  47.                  CALL pmicro_iter      ; realmente es una subrutina
  48.                ENDM
  49.  
  50. ; ------------ Estructura de datos con información para cada unidad.
  51.  
  52. info_drv       STRUC
  53. maxs           EQU   13           ; máximo 13 sectores físicos/pista
  54. tipo_drv       DB    ?            ; tipo de la disquetera (0 = no hay)
  55. control2m_flag DB    OFF          ; a ON si 2M controla la unidad
  56. cambio         DB    ON           ; a ON indica cambio de soporte
  57. version_fmt    DB    ?            ; versión del formato de disco 2M
  58. multi_io       DB    ?            ; a 0 si posible acceso multi-sector
  59. chk            DB    ?            ; a 0 si checksum del sector 0 Ok
  60. vunidad        EQU   THIS WORD
  61. vunidad0       DB    ?            ; velocidad pista 0
  62. vunidadx       DB    ?            ; velocidad demás pistas
  63. gap            DB    ?            ; GAP entre sectores (leer/escribir)
  64. sectpista      DB    ?            ; sectores lógicos por pista
  65. tabla_tsect    DB    maxs DUP (?) ; tamaños de sectores 1, 2, ..., N
  66. tam_fat        DB    ?            ; sectores/FAT en la unidad
  67.                ENDS
  68.  
  69. ; ------------ Programa.
  70.  
  71. _PRINCIPAL     SEGMENT
  72.                ASSUME CS:_PRINCIPAL, DS:_PRINCIPAL
  73.  
  74.                ORG   0                 ; código binario puro
  75.  
  76. ; ****************************************
  77. ; *                                      *
  78. ; *   D A T O S    R E S I D E N T E S   *
  79. ; *                                      *
  80. ; ****************************************
  81.  
  82. ; ------------ Variables del programa (justo al principio).
  83.  
  84. info_ptr       DW    info_A       ; punteros a datos de las unidades
  85.                DW    info_B
  86.  
  87.                DB    "21"         ; Versión 2MFBOOT 2.1
  88.  
  89. id_sistema     DB    "2M-STV"     ; identificación de disco 2M
  90. unidad         DB    ?            ; unidad física de disco en curso
  91. numsect        DW    ?            ; sectores a transferir
  92. sectini        DW    ?            ; primer sector DOS a transferir
  93. cilindro       DB    ?            ; cilindro del disco a acceder
  94. cabezal        DB    ?            ; cabezal a emplear
  95. sector         DB    ?            ; número de sector físico
  96. sector_ini     DB    ?            ; número de sector físico inicial
  97. sector_fin     DB    ?            ; número de sector físico final
  98. seccion        DB    ?            ; parte del sector físico en curso
  99. secciones      DB    ?            ; sectores lógicos a transferir
  100. tsector        DB    ?            ; LOG2 (tamaño de sector) - 7
  101. buffer         DW    buffer_io    ; puntero al buffer intermedio
  102. buf_unidad     DB    ?            ; unidad del sector en el buffer
  103. buf_cilcab     DW    ?            ; cilindro/cabezal de sector buffer
  104. buf_sector     DB    ?            ; número de sector en el buffer
  105. status         DB    ?            ; resultado de los accesos a disco
  106. fdc_result     DB    7 DUP (?)    ; bytes de resultados del FDC
  107. orden          DB    ?            ; operación F_READ/F_WRITE/F_VERIFY
  108. tab_ordenes    DB    F_READ
  109.                DB    F_WRITE
  110.                DB    F_VERIFY     ; órdenes 2, 3 y 4
  111.  
  112.                ; --- Interpretación BIOS de los bits de ST1
  113.  
  114. lista_errs     DB    4            ; 'sector not found'
  115.                DB    0
  116.                DB    10h          ; 'bad CRC'
  117.                DB    8            ; 'DMA overrun'
  118.                DB    0
  119.                DB    4            ; 'sector not found'
  120.                DB    3            ; 'write-protect error'
  121.                DB    2            ; 'address mark not found'
  122.                DB    20h          ; en otro caso: 'bad NEC'
  123.  
  124. info_A         info_drv <>        ; datos de A:
  125. info_B         info_drv <>        ; datos de B:
  126.  
  127. ; ***************************************
  128. ; *                                     *
  129. ; *   C O D I G O   R E S I D E N T E   *
  130. ; *                                     *
  131. ; ***************************************
  132.  
  133. ; ------------ Nueva rutina de gestión de INT 13h. Llama a la INT 13h
  134. ;              original o a una nueva rutina de control para la
  135. ;              lectura (AH=2), escritura (AH=3) y verificación (AH=4)
  136. ;              según el tipo de disco introducido.
  137.  
  138. ges_int13      PROC  FAR
  139.                STI
  140.                CLD
  141.                PUSHF
  142.                PUSH  SI
  143.                CMP   DL,2
  144.                JAE   ges13bios         ; no es disquetera A: ó B:
  145.                CALL  set_SI_drv
  146.                CMP   CS:[SI].tipo_drv,2  ; ¿unidad 1.2M?
  147.                JE    ges_2m
  148.                CMP   CS:[SI].tipo_drv,4  ; ¿unidad 1.44/2.88M?
  149. ges_2m:        JC    ges13bios         ; no es unidad de alta densidad
  150.                CMP   AH,2
  151.                JB    ges13bios         ; no Read/Write/Verify/Format
  152.                CMP   AH,5
  153.                JA    ges13bios         ; no Read/Write/Verify/Format
  154.                JNE   no_format
  155.                CALL  set_flag_STV      ; CF = 0 -> "disco no 2M"
  156.                JMP   ges13bios
  157. no_format:     CALL  detecta_cambio    ; ¿cambio de disco?
  158.                JNC   dilucida
  159.                POP   SI
  160.                POPF
  161.                STC                     ; hubo cambio:
  162.                MOV   AX,600h
  163.                RET   2                 ; retornar con error
  164. dilucida:      CMP   CS:[SI].control2m_flag,OFF
  165.                JE    ges13bios         ; la unidad la controla la BIOS
  166.                POP   SI
  167.                POPF
  168.                CALL  control2m         ; la controla 2M
  169.                RET   2
  170. ges13bios:     POP   SI
  171.                POPF
  172.                JMP   CS:ant_int13      ; saltar al gestor de INT 13h
  173. ges_int13      ENDP
  174.  
  175. ; ------------ A la entrada en DL se indica la unidad y a la salida se
  176. ;              devuelve SI apuntando sus variables sin alterar flags.
  177.  
  178. set_SI_drv     PROC
  179.                PUSHF
  180.                PUSH  BX
  181.                MOV   BL,DL
  182.                MOV   BH,0
  183.                SHL   BX,1
  184.